package com.bitoon.basketdudes.ws;
import com.bitoon.basketdudes.jpa.Partida;
import com.bitoon.basketdudes.jpa.Partido;
import com.bitoon.basketdudes.jpa.PersistenceManager;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom.*;
import org.apache.log4j.*;
import org.jdom.output.XMLOutputter;

/**
 * @author paco FELC 2010
 */
public class Catalogo {

    private EntityManagerFactory emfBasket;
    Logger  m_log = Logger.getLogger(LoginAction.class);

    public Catalogo() {
        emfBasket = null;
        m_log = Logger.getLogger(LoginAction.class);

        String catalogos[] = {"jpa_catalogo", "jpa_basket"};
        try {
            // JPA Units
            emfBasket = PersistenceManager.getInstance().getEntityManagerFactory(catalogos[1]);
        } catch (Exception e) {
            m_log.error("[ERROR][constructor]: No se pudo conectar a la base de datos: " + e);
        }

    }

    public String wsUltimosPartidos ( HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em          = null;
        XMLOutputter    out         = null;
        Document        doc         = null;
        int             error       = 0;
        short           id          = 0;

m_log.debug("[ultimosPartidos Inicio]: " );

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Date fecha   = Util.FechaSiguiente(-1);

            // componemos el xml
            Element root=new Element("ultimosPartidos");
            root.setAttribute("err", new Integer(error).toString());

            Query q = em.createNamedQuery("Partido.findUltimos");
            q.setParameter("fecha", fecha);
            q.setMaxResults(10);
            List<Partido> lista = q.getResultList();

            if (!lista.isEmpty()) {
                for ( int i=0;i< lista.size(); i++) {
                    Partido row = lista.get(i);

                    Element elemento = new Element("partida");

                    elemento.setAttribute("id",        String.valueOf(row.getId             ()));
                    elemento.setAttribute("equipo1",   String.valueOf(row.getEquipo1().getId() ));
                    elemento.setAttribute("equipo2",   String.valueOf(row.getEquipo2().getId()));
                    // Tanteo
                    elemento.setAttribute("puntos1",   String.valueOf(row.getPuntos1()));
                    elemento.setAttribute("puntos2",   String.valueOf(row.getPuntos2  ()));

                    elemento.setAttribute("nombre1",   String.valueOf(row.getEquipo1().getNombre() + " " +
                                                       String.valueOf(row.getEquipo1().getNick())));
                    elemento.setAttribute("nombre2",   String.valueOf(row.getEquipo2().getNombre() + " " +
                                                       String.valueOf(row.getEquipo2().getNick())));

                    elemento.setAttribute("usu1"   ,   String.valueOf(row.getEquipo1().getUsuario().getNickMostrar()));
                    elemento.setAttribute("usu2"   ,   String.valueOf(row.getEquipo2().getUsuario().getNickMostrar()));

                    elemento.setAttribute("nivel1",    String.valueOf(row.getEquipo1().getNivel()));
                    elemento.setAttribute("nivel2",    String.valueOf(row.getEquipo2().getNivel()));

                    elemento.setAttribute("escudo1",    String.valueOf(row.getEquipo1().getAspectoEquipo().getLogoimgId()));
                    elemento.setAttribute("escudo2",    String.valueOf(row.getEquipo2().getAspectoEquipo().getLogoimgId()));

                    root.addContent(elemento);
                }
            }

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[consultarPartidos]: " , e);
//            pintarStackTrace(e.getStackTrace());

        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

    public String wsPartidosEnJuego ( HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em          = null;
        XMLOutputter    out         = null;
        Document        doc         = null;
        int             error       = 0;
        short           id          = 0;

m_log.debug("[partidos_en_juego Inicio]: " );

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Date fecha   = Util.FechaSiguiente(-1);

            /* componemos el xml */
            Element root=new Element("partidos");
            root.setAttribute("err", new Integer(error).toString());

            Query q = em.createNamedQuery("Partida.findEnJuego");
            q.setParameter("fecha", fecha);
            q.setMaxResults(10);
            List<Partida> lista = q.getResultList();

            if (!lista.isEmpty()) {
                for ( int i=0;i< lista.size(); i++) {
                    Partida row = lista.get(i);

                    Element elemento = new Element("partida");

                    elemento.setAttribute("id",        String.valueOf(row.getId             ()));
                    elemento.setAttribute("equipo1",   String.valueOf(row.getEquipo1Id      ()));
                    elemento.setAttribute("equipo2",   String.valueOf(row.getEquipo2Id      ()));
                    /* Tanteo */
                    elemento.setAttribute("puntos1",   String.valueOf(row.getPuntosEquipo1  ()));
                    elemento.setAttribute("puntos2",   String.valueOf(row.getPuntosEquipo2  ()));

                    elemento.setAttribute("nombre1",   String.valueOf(row.getEquipo1().getNombre() + " " +
                                                       String.valueOf(row.getEquipo1().getNick())));
                    elemento.setAttribute("nombre2",   String.valueOf(row.getEquipo2().getNombre() + " " +
                                                       String.valueOf(row.getEquipo2().getNick())));

                    elemento.setAttribute("usu1"   ,   String.valueOf(row.getEquipo1().getUsuario().getNickMostrar()));
                    elemento.setAttribute("usu2"   ,   String.valueOf(row.getEquipo2().getUsuario().getNickMostrar()));

                    elemento.setAttribute("nivel1",    String.valueOf(row.getEquipo1().getNivel()));
                    elemento.setAttribute("nivel2",    String.valueOf(row.getEquipo2().getNivel()));

                    elemento.setAttribute("escudo1",    String.valueOf(row.getEquipo1().getAspectoEquipo().getLogoimgId()));
                    elemento.setAttribute("escudo2",    String.valueOf(row.getEquipo2().getAspectoEquipo().getLogoimgId()));

                    elemento.setAttribute("estado",    String.valueOf(row.getCuartoJuego()));

                    root.addContent(elemento);
                }
            }

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[consultarPartidos]: " , e);
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

    public String wsNumeroPartidosEnJuego ( HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em          = null;
        XMLOutputter    out         = null;
        Document        doc         = null;
        int             error       = 0;
        short           id          = 0;

m_log.debug("[partidos_en_juego Inicio]: " );

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Query query=em.createQuery("SELECT COUNT(p.id) FROM Partida p where p.estado<4 and p.estado>0 and p.fAlta> :fecha  ");
            java.util.Date hoy = new java.util.Date( );
            long milisec = hoy.getTime();
            milisec = milisec - 30*60*1000; // 30 minutos
            java.sql.Date  hoy_sql = new java.sql.Date( milisec );
            query.setParameter("fecha",  hoy_sql );

            Number countResult=(Number) query.getSingleResult();

            /* componemos el xml */
            Element root=new Element("cuantos");
            root.setAttribute("err", new Integer(error).toString());

            root.setAttribute("total", countResult.toString());

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[partidos_en_juego]: " , e);

        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

    public String wsConsultarSinEmpezar ( HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em          = null;
        XMLOutputter    out         = null;
        Document        doc         = null;
        int             error       = 0;
        short           id          = 0;

m_log.debug("[SinEmpezar Inicio]: " );

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Query query=em.createQuery("SELECT COUNT(p.id) FROM Partida p where p.estado<0 and p.fAlta> :fecha ");
            java.util.Date hoy = new java.util.Date( );
            long milisec = hoy.getTime();
            milisec = milisec - 5*60*1000; // 5 minutos
            java.sql.Date  hoy_sql = new java.sql.Date( milisec );
            query.setParameter("fecha",  hoy_sql );

            Number countResult=(Number) query.getSingleResult();

            /* componemos el xml */
            Element root=new Element("cuantos");
            root.setAttribute("err", new Integer(error).toString());

            root.setAttribute("total", countResult.toString());

            doc=new Document(root);//Creamos el documento
            doc.setDocType(null);
            out=new XMLOutputter();
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[SinEmpezar]: " , e);

        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }


    /* Borramos del catálogo los partidos que no se han celebrado */
    /* Por ahora dejamos los partidos que si han finalizado. Quizá haya que borrarlos también */
    public String wsLimpiarPartidas ( HttpServletRequest request, HttpServletResponse response) {
        EntityManager   em          = null;
        XMLOutputter    out         = null;
        Document        doc         = null;
        int             error       = 0;
        short           id          = 0;

m_log.debug("[limpiarPartidas]: " );

        try {
            em = emfBasket.createEntityManager(); // check 07.08.2012

            Query q=em.createQuery("SELECT p from Partida p where p.estado<4 and p.fAlta< :fecha order by p.fAlta");

            java.util.Date hoy = new java.util.Date( );
            long milisec = hoy.getTime();
            milisec = milisec - 30*60*1000; // 10 minutos
            java.sql.Date  hoy_sql = new java.sql.Date( milisec );

            q.setParameter("fecha",  hoy_sql );
            List<Partida> lista = q.getResultList();

            if (!lista.isEmpty()) {
                em.getTransaction().begin();
                for ( int i=0;i< lista.size(); i++) {
                    Partida row = lista.get(i);
                    em.remove ( row );
                }
                em.getTransaction().commit();
            }
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[limpiar_partidas]: " , e);

        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }

        return out.outputString(doc);
    }

}
